<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //扩展运算符取代apply
    Math.max.apply(null,[14,3,77]);
    console.log(Math.max(...[14,3,77]) );

    var arr1 = [0,1,2]
    var arr2 = [3,4,5]
    Array.prototype.push.apply(arr1,arr2)
    arr1.push(...arr2);
           
    // concat() 方法用于连接两个或多个数组。
// 该方法不会改变现有的数组，而仅仅会返回被连接数组的一个副本。     
    const a1 = [1,2]
    const a2 = a1.concat();
    a2[0] = 2;
    console.log(a1);

    //合并数组
    const a3 = [{foo:1}]
    const a4 = [{bar:2}]
    const a5 = a3.concat(a4)
    const a6 = [...a3,...a4]
    console.log(a5[0]===a3[0])//true
    console.log(a6[0]===a3[0])//true
    //上面代码中a3和a4是用两种不同方法合并而成的新数组，但是它们的成员都是对原
    //数组成员的引用 这就是浅拷贝 如果修改了引用指向的值 会同步反映到新数组
    
    //扩展运算符用于生成数组时只能放在参数的最后一位 否则会报错
    // const [...butLast,last] = [1,2,3,4]//报错
    console.log(...'hello')

    let arrayLike = {
        '0':'a',
        '1':'b',
        '2':'c',
        length:3,
        // [Symbol.iterator]:Array.prototype[Symbol.iterator]
    }
    console.log([].slice.apply(arrayLike))
    //只要是部署了Itertor接口的数据结构或者类似数组的对象 都可以被Array.from转为真正的数组
    //Array.from还可以接受第二个参数 作用类似于数组的map方法
    // 用来对每个元素进行处理，将处理后的值放入返回的数组
    console.log( Array.from([1,2,3],x=>x*x) )
    console.log(Array.from({length:2},()=> 'jack'))

    //-------------------------------------------------
    //Array.of()方法用于将一组值 转换为数组
    //这个方法的主要目的是弥补数组构造函数Array()的不足
    console.log(Array.of())//[]
    Array.of(undefined)
    console.log(Array.of(1))
    console.log(Array(1))//[empty]
  
    console.log([NaN].find((v)=>v===NaN))
    //NaN===NaN false
    //NaN == NaN false
     
    //发现NaN的方法1
    console.log([NaN].findIndex(y => Object.is( NaN , y)))
    //0
    
    //发现NaN的方法2
    function f(v){
     return Object.is(NaN,v)
    }
   console.log([NaN].find(f,NaN))//NaN

   console.log( [1,2,3].includes(3,2))
   console.log( [1,2,3].includes(3,3))
   console.log( [1,2,3].includes(3,-2));
    
   var arr3 = {length:5,3:1};

   [].copyWithin.call(arr3,0,3)
   console.log(arr3)
   
</script>
</html>